1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- #ifndef FLAT_KIT_FOG_INCLUDED
- #define FLAT_KIT_FOG_INCLUDED
- TEXTURE2D_X (_BlitTexture);
- SAMPLER (sampler_BlitTexture);
- float Linear01Depth(float z)
- {
- const float isOrtho = unity_OrthoParams.w;
- const float isPers = 1.0 - unity_OrthoParams.w;
- z *= _ZBufferParams.x;
- return (1.0 - isOrtho * z) / (isPers * z + _ZBufferParams.y);
- }
- float LinearEyeDepth(float z)
- {
- return rcp(_ZBufferParams.z * z + _ZBufferParams.w);
- }
- float4 SampleCameraColor(float2 uv)
- {
- return SAMPLE_TEXTURE2D_X(_BlitTexture, sampler_BlitTexture, UnityStereoTransformScreenSpaceTex(uv));
- }
- void Fog_float(float2 UV, out float4 Out)
- {
- float4 original = SampleCameraColor(UV);
- float fogBlend = _DistanceHeightBlend;
- float depthPacked = SampleSceneDepth(UV);
- #if defined(USE_DISTANCE_FOG)
- const float depthCameraPlanes = Linear01Depth(depthPacked);
- const float depthAbsolute = _ProjectionParams.y + (_ProjectionParams.z - _ProjectionParams.y) * depthCameraPlanes;
- const float depthFogPlanes = saturate((depthAbsolute - _Near) / (_Far - _Near));
- float4 distanceFog = SAMPLE_TEXTURE2D_X(_DistanceLUT, sampler_DistanceLUT, float2(depthFogPlanes, 0.5));
- distanceFog.a *= _DistanceFogIntensity;
- #else
- float4 distanceFog = float4(0, 0, 0, 0);
- fogBlend = 1.0;
- #endif
- #if defined(USE_HEIGHT_FOG)
- #if defined(FOG_CAMERA_RELATIVE)
- const float3 worldPos = float3(UV, depthPacked) * LinearEyeDepth(depthPacked) + _WorldSpaceCameraPos;
- #else
- #if !UNITY_REVERSED_Z
- // Adjust z to match NDC for OpenGL
- depthPacked = lerp(UNITY_NEAR_CLIP_VALUE, 1, depthPacked);
- #endif
-
- const float3 worldPos = ComputeWorldSpacePosition(UV, depthPacked, UNITY_MATRIX_I_VP);
- #endif
-
- const float heightUV = saturate((worldPos.y - _LowWorldY) / (_HighWorldY - _LowWorldY));
- float4 heightFog = SAMPLE_TEXTURE2D_X(_HeightLUT, sampler_HeightLUT, float2(heightUV, 0.5));
- heightFog.a *= _HeightFogIntensity;
- #else
- float4 heightFog = float4(0, 0, 0, 0);
- fogBlend = 0.0;
- #endif
- const float4 fog = lerp(distanceFog, heightFog, fogBlend);
- float4 final = lerp(original, fog, fog.a);
- final.a = original.a;
- Out = final;
- }
- #endif // FLAT_KIT_FOG_INCLUDED
|